/**
 * 图片转base64
 * @param file 图片文件对象
 * @returns {Promise<string>} 返回包含base64字符串的Promise
 */
export function imageToBase64(file: File): Promise<string> {
    // 校验文件有效性
    if (!(file instanceof File)) {
        return Promise.reject(new TypeError('参数必须是File类型'))
    }

    // 校验文件类型
    if (!file.type.startsWith('image/')) {
        return Promise.reject(new Error('文件类型必须是图片类型'))
    }

    // 返回Promise
    return new Promise((resolve, reject) => {
        // 创建FileReader对象
        const reader = new FileReader()

        // 监听加载完成事件
        reader.onload = () => {
            // reader.result 会返回完整的data URL
            if (typeof reader.result === 'string') {
                resolve(reader.result)
            } else {
                reject(new Error('读取结果类型不正确'))
            }
        }

        // 监听加载错误事件
        reader.onerror = () => {
            reject(new Error(`文件读取失败: ${reader.error?.message || '未知错误'}`))
        }

        // 开始读取文件
        reader.readAsDataURL(file)
    })
}

/**
 * 图片转png（DataURL格式）
 * @param file 图片文件对象(支持jpg，jpeg，bmp，webp，svg)
 * @returns {Promise<string>} png格式的DataURL字符串
 */
export function imageToPng(file: File): Promise<string> {
    // 校验文件有效性
    if (!(file instanceof File)) {
        return Promise.reject(new TypeError('参数必须是File类型'))
    }

    // 校验文件类型
    const validTypes = ['image/jpeg', 'image/jpg', 'image/bmp', 'image/webp', 'image/svg+xml']
    if (!validTypes.includes(file.type)) {
        return Promise.reject(new Error('文件类型必须是jpg，jpeg，bmp，webp，svg其中的一种'))
    }

    // 返回Promise
    return new Promise((resolve, reject) => {
        // 创建图片元素
        const img = new Image()
        // 创建临时URL引用文件
        const objectURL = URL.createObjectURL(file)
        // 设置图片源
        img.src = objectURL

        // 图片加载成功处理
        img.onload = () => {
            // 释放临时URL避免内存泄漏
            URL.revokeObjectURL(objectURL)

            // 创建canvas并设置尺寸
            const canvas = document.createElement('canvas')
            canvas.width = img.naturalWidth
            canvas.height = img.naturalHeight

            // 获取canvas上下文（可能失败的关键点）
            const ctx = canvas.getContext('2d')
            if (!ctx) {
                reject(new Error('无法获取canvas 2D上下文'))
                return
            }

            // 绘制图片到canvas（可能因图片格式不支持导致绘制异常）
            try {
                ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
            } catch (drawError) {
                reject(new Error(`图片绘制到canvas失败: ${drawError instanceof Error ? drawError.message : '未知错误'}`))
                return
            }

            // 导出为PNG DataURL（可能因浏览器限制失败）
            try {
                const pngDataURL = canvas.toDataURL('image/png')
                resolve(pngDataURL)
            } catch (exportError) {
                reject(new Error(`导出PNG格式失败: ${exportError instanceof Error ? exportError.message : '未知错误'}`))
            }
        }

        // 图片加载失败处理
        img.onerror = errorEvent => {
            URL.revokeObjectURL(objectURL)
            reject(new Error(`图片加载失败: ${errorEvent instanceof ErrorEvent ? errorEvent.message : '未知错误'}`))
        }
    })
}

/**
 * 图片转svg（DataURL格式）
 * @param file 图片文件对象（支持所有图片类型）
 * @returns {Promise<string>} svg格式的DataURL字符串
 */
export function imageToSvg(file: File): Promise<string> {
    // 校验文件有效性（与现有逻辑一致）
    if (!(file instanceof File)) {
        return Promise.reject(new TypeError('参数必须是File类型'))
    }

    // 校验文件类型（支持所有图片类型）
    if (!file.type.startsWith('image/')) {
        return Promise.reject(new Error('文件类型必须是图片类型'))
    }

    // 返回Promise
    return new Promise((resolve, reject) => {
        // 创建图片元素加载文件
        const img = new Image()
        const objectURL = URL.createObjectURL(file)
        img.src = objectURL

        // 图片加载成功处理
        img.onload = () => {
            URL.revokeObjectURL(objectURL) // 释放临时URL

            // 获取图片原始尺寸
            const width = img.naturalWidth
            const height = img.naturalHeight

            // 使用现有imageToBase64获取原图DataURL
            imageToBase64(file)
                .then(dataURL => {
                    // 构造SVG内容（包含命名空间和图片嵌入）
                    const svgContent = `
                        <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="${width}" height="${height}">
                            <image xlink:href="${dataURL}" width="${width}" height="${height}" />
                        </svg>
                    `
                        .trim()
                        .replace(/\s+/g, ' ') // 压缩空格减少DataURL长度

                    // 生成SVG DataURL（注意编码处理）
                    const svgDataURL = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgContent)}`
                    resolve(svgDataURL)
                })
                .catch(err => reject(new Error(`生成SVG失败: ${err.message}`)))
        }

        // 图片加载失败处理
        img.onerror = errorEvent => {
            URL.revokeObjectURL(objectURL)
            reject(new Error(`图片加载失败: ${errorEvent instanceof ErrorEvent ? errorEvent.message : '未知错误'}`))
        }
    })
}
